package com.zzyl.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists;
import com.zzyl.dto.UserLoginRequestDto;
import com.zzyl.entity.Member;
import com.zzyl.mapper.MemberMapper;
import com.zzyl.service.MemberService;
import com.zzyl.service.WechatService;
import com.zzyl.utils.JwtUtil;
import com.zzyl.vo.LoginVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class MemberServiceImpl implements MemberService {
    @Autowired
    MemberMapper memberMapper;
    @Autowired
    WechatService wechatService;

    static ArrayList<String> DEFAULT_NICKNAME_PREFIX = Lists.newArrayList(
            "生活更美好",
            "大桔大利",
            "日富一日",
            "好柿开花",
            "柿柿如意",
            "一椰暴富",
            "大柚所为",
            "杨梅吐气",
            "天生荔枝"

    );

    @Override
    public LoginVo Login(UserLoginRequestDto  userLoginRequestDto ) {
        // 使用微信code获取openid
        String openId = wechatService.getOpenId(userLoginRequestDto.getCode());
        // 使用微信phoneCode获取手机号
        String currentphone = wechatService.getPhone(userLoginRequestDto.getPhoneCode());
        // 查询数据库中是否存在该用户
        Member member = memberMapper.getMemberByOpenId(openId);
        // 如果数据库中不存在该用户，则创建新用户
        if (member == null) {
            member = new Member();
            member.setOpenId(openId);
        }
        // 保存或更新用户信息
        saveOrUpdate(member, currentphone);

        // 构建LoginVo对象
        LoginVo loginVo = new LoginVo();
        // 设置微信昵称
        loginVo.setNickName(member.getName());
        // 创建一个包含用户名和用户ID的Map
        Map<String, Object> map = new HashMap<>();
        map.put("username", member.getName());
        map.put("id", member.getId());
        // 使用JwtUtil创建一个JWT token，有效期为600000毫秒
        String token = JwtUtil.createJWT("itheima", 600000, map);
        // 设置token到LoginVo对象中
        loginVo.setToken(token);

        return loginVo;
    }

    // 保存或更新用户信息
    private void saveOrUpdate(Member member, String currentphone) {
        // 判断手机号是否与数据库中一致，如果不一致则更新
        if (ObjectUtil.notEqual(currentphone, member.getPhone())) {
            member.setPhone(currentphone);
        }

        // 判断用户ID是否存在
        if (member.getId() == null) {
            // 如果用户ID不存在，则新增用户
            String nickName = DEFAULT_NICKNAME_PREFIX.get(RandomUtil.randomInt(DEFAULT_NICKNAME_PREFIX.size()))
                    + StringUtils.substring(member.getPhone(), 7, 11);
            // 生成一个新的昵称，由默认前缀加上手机号码的后四位组成
            member.setName(nickName);
            member.setGender(1); // 设置性别，假设1代表某
            // 将新的用户插入数据库
            memberMapper.insert(member);
        } else {
            // 如果用户ID存在，则更新用户信息
            memberMapper.updateById(member);
        }
    }

}
